package com.briup.upload.service.impl;

import com.briup.common.exception.CustomerException;
import com.briup.common.util.QiniuUtil;
import com.briup.common.web.MessageStatus;
import com.briup.dataset.mapper.extend.DataSetExtendMapper;
import com.briup.upload.constants.UploadConstants;
import com.briup.upload.service.IRecoverImageService;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class RecoverImageServiceImpl implements IRecoverImageService {

    //本地上传的默认路径
    private String bastPath;

    // 当前设置的上传方式：local remote
    private String uploadType;

    // 恢复图片是用的指定位置
    private String baseRecoverDir;

    public RecoverImageServiceImpl(String bastPath, String uploadType, String baseRecoverDir) {
        this.bastPath = bastPath;
        this.uploadType = uploadType;
        this.baseRecoverDir = baseRecoverDir;
    }

    @Autowired
    private DataSetExtendMapper dataSetExtendMapper;

    /**
     * 恢复图片
     * @param datasetId 数据集ID
     */
    @Override
    public void recoverImage(int datasetId)throws CustomerException {

        // 根据数据集ID，查询出分类和对应的图片唯一标识
        // 可以通过map获取到分类名字和对应的一个图片的标识
        // String classifyName = m.get("classifyName");
        // String entityUuid = m.get("entityUuid");
        List<Map<String, String>> list = dataSetExtendMapper.selectClassifyAndEntity(datasetId);

        // 如果只是创建数据还没上传压缩包,此时没有相关的分类和图片
        if (list == null || list.size() == 0){
            throw new CustomerException(MessageStatus.DATA_NONE);
        }

        // key:分类名称  value:分类对应的所有图片（List）的唯一标识
        Map<String, List<String>> map = new HashMap<>();

        // 循环，拿到每个图片的标识和对应的分类名字
        list.forEach(m -> {
            String classifyName = m.get("classifyName");
            String entityUuid = m.get("entityUuid");

            // 如果map中还没有分类，就添加进来
            if (!map.containsKey(classifyName)) {
                map.put(classifyName, new ArrayList<>());
            }
            // 把图片标识合并到指定的分类中
            map.get(classifyName).add(entityUuid);
        });


        if (!baseRecoverDir.endsWith("/")) {
            baseRecoverDir = baseRecoverDir + "/";
        }

        if (!bastPath.endsWith("/")) {
            bastPath = bastPath + "/";
        }

        // 本地恢复
        if (UploadConstants.UPLOAD_TYPE_LOCAL.equalsIgnoreCase(uploadType)) {
            localRecoverImage(map);
        }
        // 远程恢复
        else if (UploadConstants.UPLOAD_TYPE_REMOTE.equalsIgnoreCase(uploadType)) {
            remoteQiNiuYunRecoverImage(map);
        } else {
            throw new CustomerException(MessageStatus.RECOVER_TYPE_ERROR);
        }


    }

    /**
     * 本地恢复图片
     * @param map key是分类名称，value分类下面的所有图片标识
     */
    private void localRecoverImage(Map<String, List<String>> map) {

        // 循环拿到每一个分类名字
        for (String classifyName : map.keySet()) {

            // 准备好要恢复的路径
            String tempDir = baseRecoverDir + classifyName + "/";

            // 循环拿到这个分类下面的每一个图片标识
            for (String entityUuid : map.get(classifyName)) {
                // 组合成图片的完整路径
                String filePath = bastPath + entityUuid;

                // 获取图片的名字
                String fileName = entityUuid.split("/")[entityUuid.split("/").length - 1];

                // 组合好恢复后存放的完整路径
                String newFilePath = tempDir + fileName;

                File newFile = new File(newFilePath);

                // 创建父目录
                if (!newFile.getParentFile().exists()) {
                    newFile.getParentFile().mkdirs();
                }

                // 恢复图片
                try {
                    FileUtils.copyFile(new File(filePath), new File(newFilePath));
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }

        }
    }

    /**
     * 远程恢复图片（七牛云）
     * @param map key是分类名称，value分类下面的所有图片标识
     */
    private void remoteQiNiuYunRecoverImage(Map<String, List<String>> map) {
        // 循环拿到每一个分类名字
        for (String classifyName : map.keySet()) {
            // 准备好要恢复的路径
            String tempDir = baseRecoverDir + classifyName + "/";
            // 循环拿到这个分类下面的每一个图片标识
            for (String entityUuid : map.get(classifyName)) {
                // 从七牛云中下载图片到指定位置
                QiniuUtil.download(tempDir, entityUuid);

            }

        }


    }
}
